fn main() {
    println!("Hello, world!");
    another_function();
    another_method(5,6);
    expression_way();
    let aa = five();
    println!("aa = {}", aa);
}

// · 使用 fn 关键字声明函数
// · Rust 使用 snake case 命名规范：所有的字母均小写，单词之间使用下划线分隔
fn another_function() {
    println!("Another function");
}

// 函数的参数
// · parameters 形参
// · arguments 实参
// 函数的参数类型必须指定
fn another_method(x:i32, y:u64) {
    println!("x = {}, y = {}", x, y);
}

// 函数体中的语句（statement）与表达式（expression）
// · 函数体由一系列语句组成，可选的同一个表达式结束
// · Rust 是一个基于表达式的语言
// · 语句是执行一些动作的指令
// · 表达式会计算产生一个值
// · 函数的声明/定义也是一个语句
// · 语句不返回值，所以不可以使用 let 将一个语句赋给一个变量
fn expression_way() {
    // 表达式可以赋给一个变量
    let x = 5 + 6;
    let y = {
        let x = 1; // 语句无法赋值或返回
        x + 3 // 表达式可以
    };
    println!("y = {}", y);
}
// 函数返回值
// · 在 -> 符号后面声明返回值类型，但是不可以为返回值命名
// · 在 Rust 中，返回值就是函数体里面最后一个表达式的值
// · 若想提前返回，需要使用 return 关键字，并指定一个值，大多数函数都是使用最后一个表达式作为返回值
fn five() -> i32 {
    5
}